package impl.agentt.etudiant;

import java.util.Hashtable;
import java.util.Iterator;

import fr.irit.smac.may.lib.components.messaging.receiver.AgentRef;
import fr.irit.smac.may.lib.interfaces.Push;
import fr.irit.smac.may.lib.pmbehaviour.PatternMatchingBehavior;
import message.EDTMessage;
import mysticedt.Behaviour;

public class BehaviourEtuImpl extends Behaviour {

	Hashtable<AgentRef,Integer> listP = new Hashtable<AgentRef,Integer>();
	
	/**
	 * Ici le pattern matching behavior
	 */
	PatternMatchingBehavior pmb = new PatternMatchingBehavior(this);
	
	public BehaviourEtuImpl() {
		super();
		Iterator ite = subsciptionAccess().getIdCours().iterator();
	}

	/**
	 * Cette méthode sera appelée lorsqu'un agent 
	 * recoit un message de type MessageToEtudiant.
	 * @param plop
	 * @param a
	 */
	public void caseMessageToEtudiant(Integer plop,AgentRef a){
		//ici le code qui doit être exécuté suite à l'arrivée d'un message de type
		// MessageToEtudiant. 
		
		// J'ai vu que vous aviez commencé avec les perceive decide act.
		// Moi je considère que recevoir un message c'est déjà du perceive.
		// Je considère aussi que l'agent ne traite pas plusieurs message à la fois,
		// c'est à dire que je n'écrirais PAS : 
		// this.getMessageBox.nextMessage()
		// ou this.getMessageBox.getMessage(id).
		// parce que cela sous entendrait que vous avez accès à la pile de message,
		// or c'est la pile de message qui permet d'exécuter l'agent.
		
		/**
		 * conclusion, si vous voulez respecter à la lettre le perceive/decide/act 
		 * (mais ce n'est pas obligatoire de le suivre à la lettre dans le code)
		 * vous pouvez considérer que les méthodes castTrucMachin est votre méthode decide.
		 * 
		 * Il reste à mettre en place le perceive et act.
		 * Quelque chose comme mettre .
		 * 
		 * this.doPerceive(); et au dessus de la méthode caseMessageToEtudiant vous mettez 
		 * une méthode protected doPerceive() où l'agent mettra a jour ses perceptions.
		 * Il faudra alors faire le doPerceive dans toutes les autres méthodes caseTrucMachin(..).
		 * 
		 * De la même façon une méthode doAct() appelée à la fin.
		 * 
		 * Entre les deux vous écrivez le code du decide.
		 */

		//this.doPerceive();
		
		// prendre une décision 
		
		//this.doAct();
	}
	
	public void defaultCase(Object message){
		
	}
	
	/**
	 * L'inteface cycle demande au PatternMatching d'appeler
	 * la bonne méthode en fonction du type du message.
	 */
	@Override
	protected Push<EDTMessage> cycle() {
		return new Push<EDTMessage>() {
			public void push(EDTMessage message) {
				pmb.match(message);
			}
			
		};
	}

}


